import 'dart:async';
import 'package:flutter/material.dart';

// 方法1：使用 debounce 和 throttle
class ThrottledButton extends StatefulWidget {
  final Widget child;
  final int maxClicks;
  final Duration interval;
  final Function onPressed;

  const ThrottledButton({
    super.key,
    required this.child,
    required this.maxClicks,
    required this.interval,
    required this.onPressed,
  });

  @override
  _ThrottledButtonState createState() => _ThrottledButtonState();
}

class _ThrottledButtonState extends State<ThrottledButton> {
  int _clickCount = 0;
  Timer? _timer;

  void _resetTimer() {
    _timer?.cancel();
    _timer = Timer(widget.interval, () {
      setState(() {
        _clickCount = 0; // 重置点击计数器
      });
    });
  }

  void _handlePress() {
    if (_clickCount < widget.maxClicks) {
      setState(() {
        _clickCount++;
      });
      _resetTimer(); // 重置计时器，以便在指定间隔后重置点击计数器
    } else {
      widget.onPressed(); // 执行点击回调
    }
  }

  @override
  void dispose() {
    _timer?.cancel(); // 清理计时器资源
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: _handlePress,
      child: widget.child,
    );
  }
}

// 方法2：使用 Cooldown 包装器（自定义实现）
class CooldownButton extends StatefulWidget {
  final Widget child;
  final int maxClicks;
  final Duration cooldownDuration;
  final Function onPressed;
  final bool isCoolingDown; // 控制按钮是否冷却中，外部可以控制启用/禁用按钮。

  CooldownButton({
    required this.child,
    required this.maxClicks,
    required this.cooldownDuration,
    required this.onPressed,
    this.isCoolingDown = false, // 默认不冷却中状态。
  });

  @override
  _CooldownButtonState createState() => _CooldownButtonState();
}

class _CooldownButtonState extends State<CooldownButton> {
  int _clickCount = 0;
  Timer? _timer; // 用于冷却时间。
  bool _isCoolingDown = false; // 内部状态。

  void _resetCooldown() {
    _timer?.cancel(); // 取消之前的计时器（如果有的话）。
    _timer = Timer(widget.cooldownDuration, () {
      // 设置新的计时器。
      setState(() {
        _isCoolingDown = false; // 冷却结束。
        _clickCount = 0; // 重置点击计数。
      });
    });
  }

  void _handlePress() {
    if (!_isCoolingDown && _clickCount < widget.maxClicks) {
      // 检查是否冷却中和是否达到最大点击次数。
      setState(() {
        _clickCount++; // 增加点击计数。
        widget.onPressed(); // 执行点击回调。
        _isCoolingDown = true; // 设置冷却中状态。
        _resetCooldown(); // 重置冷却计时器。
      });
    } else if (_isCoolingDown) {
      // 如果已经在冷却中，不执行任何操作。可以通过外部控制启用/禁用按钮来处理这种情况。
    } else if (_clickCount >= widget.maxClicks) {
      // 如果已经达到最大点击次数，不执行任何操作。可以通过外部控制启用/禁用按钮来处理这种情况。
    }
  }

  @override
  void dispose() {
    _timer?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: _handlePress,
      child: widget.child,
    );
  }
}
